jetcrab\parser\expressions/
logical.rs

1use crate::ast::{LogicalExpression, Node};
2use crate::lexer::TokenKind;
3use crate::parser::error::ParseResult;
4use crate::parser::Parser;
5
6impl Parser {
7    pub fn parse_logical_or_expression(&mut self) -> ParseResult<Node> {
8        let mut left = self.parse_logical_and_expression()?;
9
10        while self.check(TokenKind::LogicalOr) || self.check(TokenKind::NullishCoalescing) {
11            let operator = self.current_token_string();
12            self.advance();
13            let right = Box::new(self.parse_logical_and_expression()?);
14
15            let span = self.create_span_from_tokens();
16            left = Node::LogicalExpression(LogicalExpression {
17                left: Box::new(left),
18                operator,
19                right,
20                span: Some(span),
21            });
22        }
23
24        Ok(left)
25    }
26
27    pub fn parse_logical_and_expression(&mut self) -> ParseResult<Node> {
28        let mut left = self.parse_equality_expression()?;
29
30        while self.check(TokenKind::LogicalAnd) {
31            let operator = self.current_token_string();
32            self.advance();
33            let right = Box::new(self.parse_equality_expression()?);
34
35            let span = self.create_span_from_tokens();
36            left = Node::LogicalExpression(LogicalExpression {
37                left: Box::new(left),
38                operator,
39                right,
40                span: Some(span),
41            });
42        }
43
44        Ok(left)
45    }
46}